package com.pt25.base.dep.redis;

import com.pt25.base.exception.BizException;
import com.pt25.base.util.JsonUtil;
import com.pt25.base.util.StrUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Data
@Component
@ConfigurationProperties(prefix = "redis-configs")
class RedisProperties {
    /**
     * 默认集成名称
     */
    private String primary;

    private List<RedissonConfig> configs;

    private static final Set<String> modeSet = new HashSet<String>() {{
        add("cluster");
        add("master_slave");
        add("single");
    }};

    boolean checkConfigs() {
        Set<String> nameSet = new HashSet<>();
        configs.forEach(config -> {
            nameSet.add(config.getName());
            if (StrUtil.isBlank(config.getMode())) {
                throw new BizException("mode is empty");
            }
            if (StrUtil.isBlank(config.getName())) {
                throw new BizException("name is empty");
            }
            if (!modeSet.contains(config.getMode())) {
                throw new BizException("mode is must in [cluster,master_slave,single]");
            }
        });
        if (nameSet.size() != configs.size()) {
            throw new BizException("redis集群名称有重复！");
        }
        return true;
    }

    @Data
    static class RedissonConfig {
        /**
         * 集群类型 cluster（集群模式）  master-slave（主从模式）  single（单机模式）
         */
        private String mode;
        /**
         * 集群名称
         */
        private String name;
        /**
         * 密码
         */
        private String password;
        /**
         * 主节点地址(主从模式主节点和单机模式节点)
         */
        private String master;
        /**
         * 集群节点(集群模式节点和主从模式从节点)
         */
        private List<String> nodes;


        @Override
        public String toString() {
            return "RedissonConfig{" +
                    "mode='" + mode + '\'' +
                    ", password='" + password + '\'' +
                    ", master='" + master + '\'' +
                    ", nodes=" + JsonUtil.toJson(nodes) +
                    '}';
        }
    }
}